ECMAScriptホストがWebブラウザーである場合、この付録で定義されているECMAScript言語の構文とセマンティクスが必要です。 この付録の内容は規範的ですが、ECMAScriptホストがWebブラウザーでない場合はオプションです。
B.1 追加構文(Additional Syntax)
B.1.1 Numeric Literals
11.8.3の構文とセマンティクスは次のように拡張されます。ただし、この拡張はstrictモードコード では許可されていません。
構文:
NonOctalDigit :: one of
B.1.1.1 静的セマンティクス(Static Semantics)
- LegacyOctalIntegerLiteral ::0OctalDigit の MV は OctalDigit の MV
- LegacyOctalIntegerLiteral :: LegacyOctalIntegerLiteral OctalDigit の MV は (LegacyOctalIntegerLiteral の MV × 8 ) + OctalDigit の MV
- DecimalIntegerLiteral :: NonOctalDecimalIntegerLiteral の MV は NonOctalDecimalIntegerLiteral の MV
- NonOctalDecimalIntegerLiteral :: 0NonOctalDigit の MV は NonOctalDigit の MV
- NonOctalDecimalIntegerLiteral ::LegacyOctalLikeDecimalIntegerLiteral NonOctalDigit の MV は (LegacyOctalLikeDecimalIntegerLiteral の MV × 10) + NonOctalDigit の MV
- NonOctalDecimalIntegerLiteral :: NonOctalDecimalIntegerLiteral DecimalDigit の MV は (NonOctalDecimalIntegerLiteral の MV × 10) + DecimalDigit の MV
- LegacyOctalLikeDecimalIntegerLiteral :: 0OctalDigit の MV は OctalDigit の MV
- LegacyOctalLikeDecimalIntegerLiteral :: LegacyOctalLikeDecimalIntegerLiteral OctalDigit の MV は (LegacyOctalLikeDecimalIntegerLiteral の MV は × 10) + OctalDigit の MV
- NonOctalDigit :: 8 の MV は 8
- NonOctalDigit :: 9 の MV は 9
B.1.2 文字列リテラル(String Literals)
11.8.4の構文とセマンティクスは次のように拡張されます。ただしこの拡張はstrictモードコード では許可されていません。
構文:
ZeroToThree :: one of
FourToSeven :: one of
EscapeSequenceの定義は、strictモードまたはTemplateCharacter の解析では使用されません。
B.1.2.1 静的セマンティクス(Static Semantics)
- EscapeSequence :: LegacyOctalEscapeSequence の SV は LegacyOctalEscapeSequence の SV
- LegacyOctalEscapeSequence :: OctalDigit の SV は 値が OctalDigit の MV のコードユニット
- LegacyOctalEscapeSequence :: ZeroToThree OctalDigit の SV は 値が (8 × ZeroToThree の MV) + OctalDigit の MV のコードユニット
- LegacyOctalEscapeSequence :: FourToSeven OctalDigit の SV は 値が (8 × FourToSeven の MV) + OctalDigit の MV のコードユニット
- LegacyOctalEscapeSequence :: ZeroToThree OctalDigit OctalDigit の SV は 値が (64 × ZeroToThree の MV) + (8 × 最初の OctalDigit の MV) + 2番目の OctalDigit の MV のコードユニット
- ZeroToThree :: 0 の MV は 0
- ZeroToThree :: 1 の MV は 1
- ZeroToThree :: 2 の MV は 2
- ZeroToThree :: 3 の MV は 3
- FourToSeven :: 4 の MV は 4
- FourToSeven :: 5 の MV は 5
- FourToSeven :: 6 の MV は 6
- FourToSeven :: 7 の MV は 7
B.1.3 HTMLライクコメント(HTML-like Comments)
11.4の構文とセマンティクスは次のように拡張されます。ただしゴールシンボル Moduleを使用してソースコードを解析する場合、この拡張は許可されません。
構文:
Comment ::
MultiLineComment ::
FirstCommentLine ::
SingleLineHTMLOpenComment ::
SingleLineHTMLCloseComment ::
SingleLineDelimitedComment ::
HTMLCloseComment ::
SingleLineDelimitedCommentChars ::
SingleLineNotAsteriskChar ::
SingleLinePostAsteriskCommentChars ::
SingleLineNotForwardSlashOrAsteriskChar ::
WhiteSpaceSequence ::
SingleLineDelimitedCommentSequence ::
行末コードポイントを含むMultiLineCommentと同様に、SingleLineHTMLCloseCommentは、構文文法による解析の目的でLineTerminatorと見なされます。
B.1.4 正規表現パターン(Regular Expressions Patterns)
21.2.1の構文は、次のように変更および拡張されます。 これらの変更は、文法プロダクションの順序とコンテキスト情報によって解消されるあいまいさをもたらします。 次の文法を使用して解析する場合、各代替案は、以前のプロダクション代替案が一致しない場合にのみ考慮されます。
この代替パターンの文法とセマンティクスは、BMPパターンの構文とセマンティクスのみを変更します。 次の文法拡張には、[U]パラメーターでパラメーター化されたプロダクションが含まれています。 ただし、これらの拡張機能はいずれも、ゴールシンボルにある[U]パラメーターで解析するときに認識されるUnicodeパターンの構文を変更しません。
構文:
Term[U, N] ::
B.1.4.1 静的セマンティクス: 早期エラー(Static Semantics: Early Errors)
21.2.1.1のセマンティクスは次のように拡張されます。
- ソーステキストがこのルールに一致する場合は、構文エラー
- 最初または2番目の ClassAtom の IsCharacterClass が true で、 このプロダクションに[U]パラメーターがあるなら、構文エラー
- ClassAtomNoDash または ClassAtom の IsCharacterClass が true で、このプロダクションに[U]パラメーターがあるなら、構文エラー
B.1.4.2 静的セマンティクス(Static Semantics): IsCharacterClass
21.2.1.3のセマンティクスは次のように拡張されます
- false を返す
B.1.4.3 静的セマンティクス(Static Semantics): CharacterValue
21.2.1.4のセマンティクスは次のように拡張されます
- U+005C (REVERSE SOLIDUS) コードポイント値を返す
- ClassControlLetter に一致するコードポイントを ch とする
- ch の コードポイント値 を i とする
- i を32で割った余りを返す
- LegacyOctalEscapeSequence (B.1.2 ) の SV を評価して、 コードユニット cu を取得する
- cu の数値を返す
B.1.4.4 パターンセマンティクス(Pattern Semantics)
21.2.2のセマンティクスは次のように拡張されます。
21.2.2.5の次の参照は、
次の二つの意味があると解釈されます。
Term(21.2.2.5)には、次の追加の評価ルールが含まれます。
次のプロダクションは、以下のアルゴリズムで評価します。
は、
と同じように評価されます。
ただし Atom の代わりに QuantifiableAssertion が使用されます。
は、
と同じように評価されます。
ただし Atom の代わりに ExtendedAtom が使用されます。
は、
と同じように評価されます。
ただし Atom の代わりに ExtendedAtom が使用されます。
Assertion(21.2.2.6)には、次の追加の評価ルールが含まれます。
は、次のように評価されます。
- QuantifiableAssertion 評価して、 Matcher m を取得する
- m を返す
と、
のアサーション(21.2.2.6)評価ルールは、QuantifiableAssertion にも使用されます。ただし、QuantifiableAssertion が Assertion の代わりに使用されます。
を除くAtomプロダクションのAtom(21.2.2.8)評価ルールも ExtendedAtom プロダクションに使用されます。ただし、ExtendedAtom が Atom の代わりに使用されます。パラメータdirectionを含む次の評価ルールも追加されます。
次のプロダクションは、以下のアルゴリズムで評価します。
ExtendedAtom ::
- 単一の文字 \ U+005C (REVERSE SOLIDUS) を含むCharSet を A とする
- CharacterSetMatcher(A, false, direction) を呼び出し、結果の Matcher を返す
次のプロダクションは、以下のアルゴリズムで評価します。
- ExtendedPatternCharacter であらわさせる文字を ch とする
- ch を含む1要素のCharSetを A とする
- CharacterSetMatcher(A, false, direction) を呼び出し、結果の Matcher を返す
CharacterEscape (21.2.2.10) には、次の追加の評価ルールが含まれます。
次のプロダクションは、以下のアルゴリズムで評価します。
- CharacterEscape の CharacterValue を cv とする
- 文字値が cv の文字を返す
NonemptyClassRanges(21.2.2.15)は、次の評価ルールを変更します。
次のプロダクションは、以下のアルゴリズムで評価します。
- 最初の ClassAtom 評価して、 CharSet A を取得する
- 2番目の ClassAtom 評価して、 CharSet B を取得する
- ClassRanges 評価して、 CharSet C を取得する
- CharacterRangeOrUnion(A, B) をコールし、その結果の CharSet を D とする
- CharSets D と C の和集合を返す
NonemptyClassRangesNoDash(21.2.2.16)は、次の評価ルールを変更します。
次のプロダクションは、以下のアルゴリズムで評価します。
- ClassAtomNoDash 評価して、 CharSet A を取得する
- ClassAtom 評価して、 CharSet B を取得する
- ClassRanges 評価して、 CharSet C を取得する
- CharacterRangeOrUnion(A, B) をコールし、その結果の CharSet を D とする
- CharSets D と C の和集合を返す
ClassEscape(21.2.2.19)には、次の追加の評価ルールが含まれます
次のプロダクションは、以下のアルゴリズムで評価します。
- ClassEscape の CharacterValue を cv とする
- 文字値が cv の文字を c とする
- 単一の文字 c を含むCharSetを返す
ClassAtomNoDash(21.2.2.18)には、次の追加の評価ルールが含まれます
次のプロダクションは、以下のアルゴリズムで評価します。
- 単一の文字 \ U+005C (REVERSE SOLIDUS) を含むCharSetを返す
B.1.4.4.1 ランタイムセマンティクス(Runtime Semantics): CharacterRangeOrUnion ( A, B )
抽象操作CharacterRangeOrUnionは、2つのCharSetパラメーターAおよびBを取り、次の手順を実行します。
- Unicode が false なら、
- A または B に含まれている文字が一文字だけでないなら、
- 単一文字 U+002D (HYPHEN-MINUS) を C とする
- CharSet A と B と C の和集合を返す
- A または B に含まれている文字が一文字だけでないなら、
- CharacterRange(A, B) を返す
B.2 追加組み込みプロパティ(Additional Built-in Properties)
ECMAScriptホストがWebブラウザーの場合、標準の組み込みオブジェクトに次のプロパティが追加されます。
B.2.1 グローバルオブジェクトの追加プロパティ(Additional Properties of the Global Object)
組み込み名 | グローバル名 | ECMAScript言語との関係 |
---|---|---|
%escape% | escape | escape関数(B.2.1.1) |
%unescape% | unescape | unescape関数(B.2.1.2) |
B.2.1.1 escape ( string )
escape関数は、グローバルオブジェクトのプロパティです。 特定のコード単位を16進エスケープシーケンスに置き換えた文字列値を計算します。
値が0x00FF以下のコードユニットには、%xx形式の2桁のエスケープシーケンスが使用されます。 0x00FFより大きいコードユニットは、%uxxxxの形式の4桁のエスケープシーケンスが使用されます。
escape関数は、%escape%組み込みオブジェクトです。 この関数が引数stringで呼び出されると、次の手順が実行されます。
- ? ToString(string) を string にセットする
- string のコードユニット数を length とする
- empty String を R とする
- 0 を k とする
- k < length の間繰り返し
- string のインデックス k の コードユニット (16ビットの符号なし整数として表される) を char とする
- char が "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@*_+-./" のどれかなら、
- 単一のコードユニット char を含む文字列値を S とする
- b. と異なり、 char ≧ 256 なら、
- char の数値を n とする
- 以下の文字連結を S とする
- "%u"
- 4桁の大文字の16進数(0埋め)としてフォーマットした、nの文字列表現
- c. と異なるなら、
- Assert: char < 256
- char の数値を n とする
- 以下の文字連結を S とする
- "%"
- 2桁の大文字の16進数(0埋め)としてフォーマットした、nの文字列表現
- R と S の文字連結を R にセットする
- k + 1 を k にセットする
- R を返す
B.2.1.2 unescape ( string )
unescape関数は、グローバルオブジェクトのプロパティです。 escape関数によって変換された各エスケープシーケンスを、コードユニットに置き換えます。
unescape関数は、%unescape%組み込みオブジェクトです。 unscape関数が引数stringで呼び出されると、次の手順が実行されます。
- ? ToString(string) を string にセットする
- string のコードユニット数を length とする
- empty String を R とする
- 0 を k とする
- k ≠ length の間繰り返し
- k within string の インデックス k のコードユニットを c とする
- c が コードユニット 0x0025 (PERCENT SIGN) なら、
- k ≦ length - 6 で、 stringのインデックス k + 1 のコードユニットが 0x0075(LATIN SMALL LETTER U)で、k + 2 から k + 5 の4文字が全て16進数なら、
- string の インデックス k + 2 から k + 5 の4文字を整数値にし、対応するコードユニットを c にセットする
- k + 5 を k にセットする
- i. と異なり、 k ≦ length - 3 で、 string の インデックス k + 1 と k + 2 の2文字が16進数なら、
- "00" の後に string の インデックス k + 1 と k + 2 をつなげた4文字を整数値にし、対応するコードユニットを c にセットする
- k + 2 を k にセットする
- k ≦ length - 6 で、 stringのインデックス k + 1 のコードユニットが 0x0075(LATIN SMALL LETTER U)で、k + 2 から k + 5 の4文字が全て16進数なら、
- R と c の文字連結を R にセットする
- k + 1 を k にセットする
- R を返す
B.2.2 Object.prototypeオブジェクトの追加プロパティ(Additional Properties of the Object.prototype Object)
B.2.2.1 Object.prototype.__proto__
Object.prototype.__proto__は、属性{ [[Enumerable]]: false, [[Configurable]]: true }を持つアクセサプロパティです。
[[Get]]属性と[[Set]]属性は以下のように定義されています。
B.2.2.1.1 get Object.prototype.__proto__
[[Get]]属性の値は、引数を必要としない組み込み関数です。 次の手順を実行します。
- ? ToObject(this値) を O とする
- ? O.[[GetPrototypeOf]]() を返す
B.2.2.1.2 set Object.prototype.__proto__
[[Set]]属性の値は、引数protoを受け取る組み込み関数です。 次の手順を実行します。
- ? RequireObjectCoercible(this値) を O とする
- Type(proto) が Object型 または Null でないなら、 undefined を返す
- Type(O) が Object型 でないなら、 undefined を返す
- ? O.[[SetPrototypeOf]](proto) を status とする
- status が false なら、TypeError例外をスローする
- undefined を返す
B.2.2.2 Object.prototype.__defineGetter__ ( P, getter )
__defineGetter__ メソッドが引数 P と getter で呼び出されると、次の手順が実行されます。
- ? ToObject(this値) を O とする
- IsCallable(getter) が false なら、TypeError例外をスローする
- プロパティ記述子 { [[Get]]: getter, [[Enumerable]]: true, [[Configurable]]: true } を desc とする
- ? ToPropertyKey(P) を key とする
- ? DefinePropertyOrThrow(O, key, desc) を実行する
- undefined を返す
B.2.2.3 Object.prototype.__defineSetter__ ( P, setter )
__defineSetter__ メソッドが引数 P と setter で呼び出されると、次の手順が実行されます。
- ? ToObject(this値) を O とする
- IsCallable(setter) が false なら、TypeError例外をスローする
- プロパティ記述子 { [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: true } を desc とする
- ? ToPropertyKey(P) を key とする
- ? DefinePropertyOrThrow(O, key, desc) を実行する
- undefined を返す
B.2.2.4 Object.prototype.__lookupGetter__ ( P )
__lookupGetter__ メソッドが引数 P で呼び出されると、次の手順が実行されます。
- ? ToObject(this値) を O とする
- ? ToPropertyKey(P) を key とする
- 繰り返し
- ? O.[[GetOwnProperty]](key) を desc とする
- desc が undefined でないなら、
- IsAccessorDescriptor(desc) が true なら、 desc.[[Get]] を返す
- undefined を返す
- ? O.[[GetPrototypeOf]]() を O にセットする
- O が null なら、 undefined を返す
B.2.2.5 Object.prototype.__lookupSetter__ ( P )
__lookupSetter__ メソッドが引数 P で呼び出されると、次の手順が実行されます。
- ? ToObject(this値) を O とする
- ? ToPropertyKey(P) を key とする
- 繰り返し
- ? O.[[GetOwnProperty]](key) を desc とする
- desc が undefined でないなら、
- IsAccessorDescriptor(desc) が true なら、 desc.[[Set]] を返す
- undefined を返す
- ? O.[[GetPrototypeOf]]() を O にセットする
- O が null なら、 undefined を返す
B.2.3 String.prototypeオブジェクトの追加プロパティ(Additional Properties of the String.prototype Object)
B.2.3.1 String.prototype.substr ( start, length )
substrメソッドは、startとlengthの2つの引数を取り、thisオブジェクトを文字列に変換した結果から部分文字列を返します。部分文字列は、インデックスstartから、長さ lengthのコード単位です(lengthが定義されていない場合は文字列の終わりまで)。 startが負の場合、sourceLength + startとして扱われます。ここで、sourceLengthは文字列の長さです。 結果はString値であり、Stringオブジェクトではありません。 次の手順が実行されます。
- ? RequireObjectCoercible(this値) を O とする
- ? ToString(O) を S とする
- ? ToInteger(start) を intStart とする
- length が undefined なら、 +∞ を、異なるなら ? ToInteger(length) を end とする
- S のコードユニット数を size とする
- intStart < 0 なら max(size + intStart, 0) を intStart にセットする
- min( max(end, 0), size - intStart) を resultLength とする
- resultLength ≦ 0 なら empty String を返す
- S のインデックス intStart から長さ resultLength の連続コードユニットを含む文字列値を返す
Note
B.2.3.2 String.prototype.anchor ( name )
anchor メソッドが引数 name で呼び出されると、次の手順が実行されます。
- this値 を S とする
- ? CreateHTML(S, "a", "name", name) を返す
B.2.3.2.1 ランタイムセマンティクス(Runtime Semantics): CreateHTML ( string, tag, attribute, value )
抽象操作CreateHTMLは、引数string、tag、attribute、valueを使用して呼び出されます。 tagとattributeは文字列値である必要があります。 次の手順が実行されます。
- ? RequireObjectCoercible(string) を str とする
- ? ToString(str) を S とする
- "<" と tag の文字連結を p1 とする
- attribute が empty String でないなら、
- p1 と ">" の文字連結を p2 とする
- p2 と S の文字連結を p3 とする
- p3 と "</" と tag と ">" の文字連結を p4 とする
- p4 を返す
B.2.3.3 String.prototype.big ( )
bigメソッドが呼び出されると、次の手順が実行されます。
- this値 を S とする
- ? CreateHTML(S, "big", "", "") を返す
B.2.3.4 String.prototype.blink ( )
blinkメソッドが呼び出されると、次の手順が実行されます。
- this値 を S とする
- ? CreateHTML(S, "blink", "", "") を返す
B.2.3.5 String.prototype.bold ( )
boldメソッドが呼び出されると、次の手順が実行されます。
- this値 を S とする
- ? CreateHTML(S, "b", "", "") を返す
B.2.3.6 String.prototype.fixed ( )
fixedメソッドが呼び出されると、次の手順が実行されます。
- this値 を S とする
- ? CreateHTML(S, "tt", "", "") を返す
B.2.3.7 String.prototype.fontcolor ( color )
fontcolorメソッドが引数colorで呼び出されると、次の手順が実行されます。
- this値 を S とする
- ? CreateHTML(S, "font", "color", color) を返す
B.2.3.8 String.prototype.fontsize ( size )
fontsizeメソッドが引数sizeで呼び出されると、次の手順が実行されます。
- this値 を S とする
- ? CreateHTML(S, "font", "size", size) を返す
B.2.3.9 String.prototype.italics ( )
italicsメソッドが呼び出されると、次の手順が実行されます。
- this値 を S とする
- ? CreateHTML(S, "i", "", "") を返す
B.2.3.10 String.prototype.link ( url )
linkメソッドが引数urlで呼び出されると、次の手順が実行されます。
- this値 を S とする
- ? CreateHTML(S, "a", "href", url) を返す
B.2.3.11 String.prototype.small ( )
smallメソッドが呼び出されると、次の手順が実行されます。
- this値 を S とする
- ? CreateHTML(S, "small", "", "") を返す
B.2.3.12 String.prototype.strike ( )
strikeメソッドが呼び出されると、次の手順が実行されます。
- this値 を S とする
- ? CreateHTML(S, "strike", "", "") を返す
B.2.3.13 String.prototype.sub ( )
subメソッドが呼び出されると、次の手順が実行されます。
- this値 を S とする
- ? CreateHTML(S, "sub", "", "") を返す
B.2.3.14 String.prototype.sup ( )
supメソッドが呼び出されると、次の手順が実行されます。
- this値 を S とする
- ? CreateHTML(S, "sup", "", "") を返す
B.2.3.15 String.prototype.trimLeft ( )
"trimLeft"プロパティの初期値は、String.prototype.trimStartプロパティの初期値と同じ関数オブジェクトです。
B.2.3.16 String.prototype.trimRight ( )
"trimRight"プロパティの初期値は、String.prototype.trimEndプロパティの初期値と同じ関数オブジェクトです。
B.2.4 Date.prototypeオブジェクトの追加プロパティ(Additional Properties of the Date.prototype Object)
B.2.4.1 Date.prototype.getYear ( )
getYearメソッドが引数なしで呼び出されると、次の手順が実行されます。
- ? thisTimeValue(this値) を t とする
- t が NaN なら、 NaN を返す
- YearFromTime( LocalTime(t)) - 1900 を返す
B.2.4.2 Date.prototype.setYear ( year )
setYearメソッドが引数 year で呼び出されると、次の手順が実行されます。
- ? thisTimeValue(this値) を t とする
- t が NaN なら +0 を、異なるなら LocalTime(t) を t にセットする
- ? ToNumber(year) を y とする
- y が NaN なら、
- NaN を thisのDateオブジェクト の [[DateValue]] 内部スロット にセットする
- NaN を返す
- ! ToInteger(y) を yi とする
- 0 ≦ yi ≦ 99 なら yi + 1900 を yyyy とする
- 6. と異なるなら、 y を yyyy とする
- MakeDay(yyyy, MonthFromTime(t), DateFromTime(t)) を d とする
- UTC( MakeDate(d, TimeWithinDay(t))) を date とする
- TimeClip(date) を thisのDateオブジェクト の [[DateValue]] 内部スロット にセットする
- thisのDateオブジェクト の [[DateValue]] 内部スロットの値を返す
B.2.4.3 Date.prototype.toGMTString ( )
Date.prototype.toGMTStringの初期値は、Date.prototype.toUTCStringの初期値である関数オブジェクトと同じです。
B.2.5 RegExp.prototypeオブジェクトの追加プロパティ(Additional Properties of the RegExp.prototype Object)
B.2.5.1 RegExp.prototype.compile ( pattern, flags )
compile メソッドが引数 pattern と flags で呼び出されると、次の手順が実行されます。
- this値 を O とする
- Type(O) が Object型でない、または O に [[RegExpMatcher]] 内部スロットがないなら、
- TypeError例外をスローする
- Type(pattern) が Object型 で pattern に [[RegExpMatcher]] 内部スロットがあるなら、
- flags が undefined でないなら、TypeError例外をスローする
- pattern.[[OriginalSource]] を P とする
- pattern.[[OriginalFlags]] を F とする
- 3. と異なるなら、
- pattern を P とする
- flags を F とする
- ? RegExpInitialize(O, P, F) を返す
B.3 その他の追加機能(Other Additional Features)
B.3.1 __proto__オブジェクトイニシャライザーのプロパティ名(__proto__ Property Names in Object Initializers)
12.2.6.1のルールに、次の早期エラールールが追加されます。 ObjectAssignmentPatternが必要なコンテキストでObjectLiteralがあらわれる場合、早期エラールールは適用されません。 さらに、CoverParenthesizedExpressionAndArrowParameterListまたはCoverCallExpressionAndAsyncArrowHeadを最初に解析するときには適用されません。
- PropertyDefinitionListのPropertyNameListに"__proto__"の重複エントリが含まれていて、それらのエントリの少なくとも2つが PropertyDefinition : PropertyName :AssignmentExpression 形式のプロダクションから取得された場合は構文エラーです
12.2.6.8の次のプロダクションは、
次の定義に置き換えられます。
- PropertyName の評価結果を propKey とする
- ReturnIfAbrupt(propKey)
- propKey が 文字列値 "__proto__" で、 IsComputedPropertyKey(PropertyName ) が false なら、
- true を isProtoSetter とする
- 3. と異なるなら、
- false を isProtoSetter とする
- IsAnonymousFunctionDefinition(AssignmentExpression ) が true で、 isProtoSetter が false なら、
- 引数 propKey を使用して AssignmentExpression の NamedEvaluation を propValue とする
- 5. と異なるなら、
- AssignmentExpression の評価結果を exprValueRef とする
- ? GetValue(exprValueRef) を propValue とする
- isProtoSetter が true なら、
- Type(propValue) が Object型 か Null なら、
- object.[[SetPrototypeOf]](propValue) を返す
- NormalCompletion(empty) を返す
- Type(propValue) が Object型 か Null なら、
- Assert: enumerable は true
- Assert: object 構成不可能なプロパティがない、拡張可能な通常のオブジェクト
- ! CreateDataPropertyOrThrow(object, propKey, propValue) を返す
B.3.2 ラベル付き関数宣言(Labelled Function Declarations)
ECMAScript2015より前は、LabelledStatementの仕様では、ステートメントラベルをFunctionDeclarationに関連付けることができませんでした。しかし、ラベル付きのFunctionDeclarationは非strictコードで許容される拡張のため、ほとんどのブラウザーでホストされるECMAScript実装で、その拡張をサポートしていました。ECMAScript2015では、LabelledStatementの文法プロダクションで、LabelledItemとしてFunctionDeclarationを使用できるようになりました。ただし、構文エラーが発生したときに生成される早期エラールールが含まれています(13.13.1)。Webブラウザーの互換性のために、そのルールは強調表示されたテキストを追加して変更されています。
- strictモードコードのソースコードがこのルールに一致するなら、構文エラー
B.3.3 ブロックレベル関数宣言Webレガシー互換性セマンティクス(Block-Level Function Declarations Web Legacy Compatibility Semantics)
ECMAScript2015より前は、FunctionDeclarationをBlockステートメントのStatementListの要素として定義していませんでした。ただし、その形式のFunctionDeclarationのサポートは許容される拡張のため、ほとんどのブラウザーでホストされるECMAScript実装で使用できました。しかし、セマンティクスは実装間で異なっています。この違いのため、Blockレベルの関数宣言を使用する既存のWeb ECMAScriptコードは、ブラウザー実装のセマンティックが同じ場合にのみ、ブラウザー実装間で移植可能です。以下は、その共通部分のセマンティクスに該当するユースケースです。
- 宣言された関数は、単一のブロック内でのみ参照されるケース
- BindingIdentifierが名前fである1つ以上のFunctionDeclarationは、それを囲む関数gのコード内で発生し、その宣言はBlock内にネストされます。
- var宣言ではないfの他の宣言は、gの関数コード内では発生しません。
- IdentifierReferenceとしてのfのすべての出現は、fの宣言を含むBlockのStatementList内にあります。
- 宣言された関数は、単一のBlock内で使用される可能性がありますが、同じBlock内に含まれていない内部関数定義によっても参照されるケース
- BindingIdentifierが名前fである1つ以上のFunctionDeclarationは、囲んでいる関数gのコード内にあり、その宣言はBlock内にネストされています。
- var宣言ではないfの他の宣言は、gの関数コード内では発生しません。
- fの宣言を含むブロックのStatementList内に、IdentifierReferenceとしてfが出現することがあります。
- g内にネストされている別の関数h内にIdentifierReferenceとしてfが少なくとも1つあり、fの他の宣言がh内からのfへの参照を隠してしていません。
- hのすべての呼び出しは、fの宣言が評価された後に発生します。
- 宣言された関数は、単一のブロック内と、後続のブロック内でも参照されるケース
- BindingIdentifierが名前fである1つ以上のFunctionDeclarationは、それを囲む関数gのコード内で発生し、その宣言がBlock内にネストされます。
- var宣言ではないfの他の宣言は、gの関数コード内では発生しません。
- fの宣言を含むBlockのStatementList内に、IdentifierReferenceとしてfが出現することがあります。
- fの宣言を含むBlockにレキシカル的に続くgのコード内に、IdentifierReferenceとしてfが1つ以上あります。
最初のユースケースは、ECMAScript2015によって提供されるBlockレベル関数宣言のセマンティクスと相互運用可能です。このユースケースを使用する既存のECMAScriptコードは、この第9、13、14章で定義されたBlockレベル関数宣言セマンティクスを使用して動作します。
2番目と3番目のユースケースのECMAScript2015の相互運用性には、9、14、18.2.1、および15.1.1のセマンティクスに対する次に示す拡張が必要です。
ECMAScript実装に診断警告メッセージを報告するメカニズムがあるという前提で、これらの互換性セマンティクスが適用されるFunctionDeclarationがコードに含まれていて、非互換性セマンティクスと動作が異なる場合、警告を出す必要があります。たとえば、varバインディングが導入されていない場合、その導入によって早期エラーが発生する可能性があるため、警告メッセージは生成されません。
B.3.3.1 FunctionDeclarationInstantiationの変更内容(Changes to FunctionDeclarationInstantiation)
FunctionDeclarationInstantiationのステップ29で、次のステップが実行されます。
- strict が false なら、
- Block または CaseClause または DefaultClause の StatementList 内に直接含まれている FunctionDeclaration を f とし、各 f ごとに次を実行する
- f の BindingIdentifier の StringValue を F とする
- fをBindingIdentifierとしてFを持つVariableStatementに置き換えても、funcの早期エラーが生成されず、FがparameterNamesの要素ではないなら、
- NOTE: Fのvarバインディングが、VarDeclaredName、仮パラメーターの名前、別のFunctionDeclarationのいずれでもない場合にのみ、ここでインスタンス化される
- initializedBindings に F が含まれず、 F が "arguments" でないなら、
- ! varEnvRec.CreateMutableBinding(F, false) を実行する
- varEnvRec.InitializeBinding(F, undefined) を実行する
- instantiatedVarNames に F を追加する
- fの評価時、FunctionDeclaration Evaluationアルゴリズム(14.1.25)の代わりに次の手順を実行する
- 実行中の実行コンテキスト の VariableEnvironment を fenv とする
- fenv の EnvironmentRecord を fenvRec とする
- 実行中の実行コンテキスト の LexicalEnvironment を benv とする
- benv の EnvironmentRecord を benvRec とする
- ! benvRec.GetBindingValue(F, false) を fobj とする
- ! fenvRec.SetMutableBinding(F, fobj, false) を実行する
- NormalCompletion(empty) を返す
- Block または CaseClause または DefaultClause の StatementList 内に直接含まれている FunctionDeclaration を f とし、各 f ごとに次を実行する
B.3.3.2 GlobalDeclarationInstantiationの変更内容(Changes to GlobalDeclarationInstantiation)
GlobalDeclarationInstantiationのステップ14は次のステップが実行されます。
- script の IsStrict を strict とする
- strict が false なら、
- 空の新規List を declaredFunctionOrVarNames とする
- declaredFunctionNames の要素を declaredFunctionOrVarNames に追加する
- declaredVarNames の要素を declaredFunctionOrVarNames に追加する
- script に含まれる Block または CaseClause または DefaultClause の StatementList に直接含まれる FunctionDeclaration を f とし、各 f ごとに次を実行する
- f の BindingIdentifier の StringValue を F とする
- f を BindingIdentifier として F を持つ VariableStatement に置き換えても、scriptの早期エラーが発生しないなら
- envRec.HasLexicalDeclaration(F) が false なら、
- ? envRec.CanDeclareGlobalVar(F) を fnDefinable とする
- fnDefinable が true なら、
- NOTE: Fのvarバインディングは、VarDeclaredNameまたは別のFunctionDeclarationの名前でない場合にのみ、ここでインスタンス化される
- declaredFunctionOrVarNames に F が含まれていないなら、
- ? envRec.CreateGlobalVarBinding(F, false) を実行する
- declaredFunctionOrVarNames に F を追加する
- fのを評価時、FunctionDeclaration Evaluation アルゴリズム(14.1.25)の代わりに次の手順を実行する
- 実行中の実行コンテキスト の VariableEnvironment を genv とする
- genv の EnvironmentRecord を genvRec とする
- 実行中の実行コンテキスト の LexicalEnvironment を benv とする
- benv の EnvironmentRecord を benvRec とする
- ! benvRec.GetBindingValue(F, false) を fobj とする
- ? genvRec.SetMutableBinding(F, fobj, false) を実行する
- NormalCompletion(empty) を返す
- envRec.HasLexicalDeclaration(F) が false なら、
B.3.3.3 EvalDeclarationInstantiationの変更内容(Changes to EvalDeclarationInstantiation)
EvalDeclarationInstantiationのステップ9で次のステップが実行されます。
- strict が false なら、
- 空の新規List を declaredFunctionOrVarNames とする
- declaredFunctionNames の要素を declaredFunctionOrVarNames に追加する
- declaredVarNames の要素を declaredFunctionOrVarNames に追加する
- body 内に含まれる Block または CaseClause または DefaultClause の StatementList に直接含まれる FunctionDeclaration を fとし、各 f ごとに次を実行する
- f の BindingIdentifier StringValue を F とする
- f を BindingIdentifier として F を持つ VariableStatement の置き換えても body の早期エラーが生成されないなら、
- false を bindingExists とする
- lexEnv を thisLex とする
- Assert: 次のループは終了する
- thisLex と varEnv が同じでない間繰り返し
- thisLex の EnvironmentRecord を thisEnvRec とする
- thisEnvRec が オブジェクト環境レコード でないなら、
- thisEnvRec.HasBinding(F) が true なら、
- true を bindingExists とする
- thisEnvRec.HasBinding(F) が true なら、
- thisLex の外部環境参照を thisLex にセットする
- bindingExists が false で、 varEnvRec が グローバル環境レコード なら、
- varEnvRec.HasLexicalDeclaration(F) が false なら、
- ? varEnvRec.CanDeclareGlobalVar(F) を fnDefinable とする
- a. と異なるなら、
- false を fnDefinable とする
- varEnvRec.HasLexicalDeclaration(F) が false なら、
- 5. と異なるなら、
- true を fnDefinable とする
- bindingExists が false で、 fnDefinable が true なら、
- declaredFunctionOrVarNames に F が含まれていないなら、
- varEnvRec が グローバル環境レコード なら、
- ? varEnvRec.CreateGlobalVarBinding(F, true) を実行する
- i. と異なるなら、
- varEnvRec.HasBinding(F) を bindingExists とする
- bindingExists が false なら、
- ! varEnvRec.CreateMutableBinding(F, true) を実行する
- ! varEnvRec.InitializeBinding(F, undefined) を実行する
- declaredFunctionOrVarNames に F を追加する
- varEnvRec が グローバル環境レコード なら、
- f の評価時、 FunctionDeclaration Evaluation(14.1.25) アルゴリズムの代わりに次の手順を実行する
- 実行中の実行コンテキスト の VariableEnvironment を genv とする
- genv の EnvironmentRecord を genvRec とする
- 実行中の実行コンテキスト の LexicalEnvironment を benv とする
- benv の EnvironmentRecord を benvRec とする
- ! benvRec.GetBindingValue(F, false) を fobj とする
- ? genvRec.SetMutableBinding(F, fobj, false) を実行する
- NormalCompletion(empty) を返す
- declaredFunctionOrVarNames に F が含まれていないなら、
B.3.3.4 Blockの静的セマンティック:早期エラーの変更内容(Changes to Block Static Semantics: Early Errors)
Webブラウザーの互換性のために、このルールは強調表示されたテキストを追加して変更しています。
- このプロダクションに一致するソースコードがstrictモードコードではなく、重複エントリがFunctionDeclarationsによってのみバインドされているという条件を除き、StatementListのLexicallyDeclaredNamesに重複エントリが含まれていると構文エラー
B.3.3.5 Statementの静的セマンティック:早期エラーの変更内容(Changes to switch Statement Static Semantics: Early Errors)
Webブラウザーの互換性のために、このルールは強調表示されたテキストを追加して変更しています。
- このプロダクションに一致するソースコードがstrictモードコードではなく、重複エントリがFunctionDeclarationsによってのみバインドされているという条件を除き、CaseBlockのLexicallyDeclaredNamesに重複エントリが含まれていると構文エラー
B.3.3.6 BlockDeclarationInstantiationの変更内容(Changes to BlockDeclarationInstantiation)
BlockDeclarationInstantiationのステップ4.a.ii.1はステップが実行されます。
- envRec.HasBinding(dn) が false なら、
- ! envRec.CreateMutableBinding(dn, false) を実行する
BlockDeclarationInstantiationのステップ4.b.iiiはステップが実行されます。
- envRec.HasBinding(fn) が false なら、
- envRec.InitializeBinding(fn, fo) を実行する
- 2. と異なるなら、
- Assert: d は FunctionDeclaration
- envRec.SetMutableBinding(fn, fo, false) を実行する
B.3.4 IfStatementステートメント句のFunctionDeclarations
以下は、13.6のIfStatementプロダクションを拡張します。
IfStatement[Yield, Await, Return] :
このプロダクションは、非strictコードを解析する場合にのみ適用されます。このプロダクションに一致するコードは、FunctionDeclaration[?Yield, ?Await, ~Default]に一致するコードが、ソースコード内のその位置を占めるBlockStatementの唯一のStatementListItemであるかのように処理されます。このような合成BlockStatementのセマンティクスには、B.3.3 で指定されているWebレガシー互換性セマンティクスが含まれます。
B.3.5 Catch BlocksのVariableStatements(VariableStatements in Catch Blocks)
13.15.1は、次のように置き換えられます。
- CatchParameter の BoundNames に重複する要素が含まれているなら、構文エラー
- CatchParameter の BoundNames のいずれかの要素が、 Block の LexicallyDeclaredNames にもあるなら、構文エラー
- CatchParameterがCatchParameter : BindingIdentifier でない場合を除き、CatchParameterのBoundNamesの要素がBlockのVarDeclaredNamesでも発生するなら、構文エラー
この変更された動作は、Catch 句の Blockに含まれるダイレクトeval呼び出しによって導入されたvarおよび関数宣言にも適用されます。 この変更は、18.2.1.3のアルゴリズムを次のように変更することで実現されます。
ステップ5.d.ii.2.a.iを、次のように置き換えます。
ステップ9.d.ii.4.b.i.iを、次のように置き換えます。
B.3.6 ForInステートメントヘッドのイニシャライザー(Initializers in ForIn Statement Heads)
以下は、13.7のIterationStatementプロダクションを拡張します。
IterationStatement[Yield, Await, Return] :
このプロダクションは、非strictコードを解析する場合にのみ適用されます。
13.7.5.3のContainsDuplicateLabelsの静的セマンティクスは、次のように拡張されます。
- 引数 labelSet を使用して Statement の ContainsDuplicateLabels を返す
13.7.5.4のContainsUndefinedBreakTargetの静的セマンティクスは、次のように拡張されます。
- 引数 labelSet を使用して Statement の ContainsUndefinedBreakTarget を返す
13.7.5.5のContainsUndefinedContinueTargetの静的セマンティクスは、次のように拡張されます。
13.7.5.6のIsDestructuringの静的セマンティクスは、次のように拡張されます。
- false を返す
13.7.5.7のVarDeclaredNamesの静的セマンティクスは、次のように拡張されます。
- BindingIdentifier の BoundNames を names とする
- Statement の VarDeclaredNames の要素を names に追加する
- names を返す
13.7.5.8のVarScopedDeclarationsの静的セマンティクスは、次のように拡張されます。
- Listcontaining BindingIdentifier を declarations とする
- Statement の VarScopedDeclarations の要素を declarations に追加する
- declarations を返す
13.7.5.11のLabelledEvaluationの静的セマンティクスは、次のように拡張されます。
- BindingIdentifier の StringValue を bindingId とする
- ? ResolveBinding(bindingId) を lhs とする
- IsAnonymousFunctionDefinition(Initializer ) が true なら、
- 引数 bindingId を使用して Initializer の NamedEvaluation を value とする
- 13. と異なるなら、
- Initializer の評価結果を rhs とする
- ? GetValue(rhs) を value とする
- ? PutValue(lhs, value) を実行する
- ? ForIn/OfHeadEvaluation(« », Expression , enumerate) を keyResult とする
- ? ForIn/OfBodyEvaluation(BindingIdentifier , Statement , keyResult, enumerate, varBinding, labelSet) を返す
B.3.7 [[IsHTMLDDA]]内部スロット(The [[IsHTMLDDA]] Internal Slot)
[[IsHTMLDDA]]内部スロットは、実装定義のオブジェクトに存在する可能性があります。 [[IsHTMLDDA]]内部スロットを持つオブジェクトは、ToBooleanおよび抽象等値比較抽象演算でundefinedのように動作し、typeof演算子のオペランドとして使用されます。
B.3.7.1 ToBooleanの変更点(Changes to ToBoolean)
表10で、Argumentの型がObjectのとき、変換結果は、次のアルゴリズムに置き換えられます。
- argument が [[IsHTMLDDA]] 内部スロット を持っているなら false を返す
- true を返す
B.3.7.2 抽象等値比較の変更点(Changes to Abstract Equality Comparison)
抽象等値比較アルゴリズムのステップ3の後に、次の手順が挿入されます。
B.3.7.3 typeof演算子の変更点(Changes to the typeof Operator)
次のテーブルエントリは、表35の「Object ([[Call]]あり)」の前に挿入されます。
val の型 | 結果 |
---|---|
Object ([[IsHTMLDDA]]内部スロットあり) | "undefined" |
この付録では、WebブラウザベースでのECMAScript実装のレガシー機能と他の特性について説明しています。 この付録で指定されているすべての言語機能と動作には、1つ以上の望ましくない特性があり、レガシーの使用法がない場合はこの仕様から削除されています。 ただし、多くの既存のWebページでこれらの機能が使用されているということは、Webブラウザーがこれらの機能を引き続きサポートする必要があるということを意味します。 この付録の仕様は、これらのレガシー機能の相互運用可能な実装の要件を定義しています。
これらの機能は、ECMAScript言語コアの一部ではありません。 プログラマーは、新しくECMAScriptコードを作成する際に、これらの機能や動作を使用しないでください。 実装は、Webブラウザーの一部であるか、レガシーECMAScriptコードを実行する必要がある場合を除いて、これらの機能を実装することをお勧めしません。